iT邦幫忙

0

Javascript 進階 2-4 執行環境與執行堆疊

  • 分享至 

  • xImage
  •  

執行環境 Excution Context

https://ithelp.ithome.com.tw/upload/images/20191002/20121770z4w2blcYkm.png

首先我們先來看到下方這張圖:

https://ithelp.ithome.com.tw/upload/images/20191002/20121770wvsreyYaXJ.png

當左方的 function 被呼叫的時候,就會創建一個 local 的作用域,並且限制在這個作用域中,this的指向後續的文章會做介紹。

所以根據上述的概念,如果我們一直反覆的執行同一個 function 它就會創造出很多個不同的執行環境

另外,除了函式可以創造出執行環境以外,全域本身也有自己的執行環境喔!

https://ithelp.ithome.com.tw/upload/images/20191002/20121770CigRPGmCw9.png

全域執行環境的創建,是在你的瀏覽器一開啟,或是node.js開始運作的時候就建立了

通常會有對應的全域變數 window(Chrome) 或是 global(NodeJS),並且 this 同時等同於 window 或是 global。

https://ithelp.ithome.com.tw/upload/images/20191002/20121770oeAEQENEpH.png

接下來用實際的例子進行後面執行環境以及執行堆疊的概念吧!

function sayHi (name) {

    var greeting = 'hi';

    return greeting + ' ' + name;

}

function doSomething () {

    var mom = '老媽';

    console.log(1, sayHi(mom));

}

doSomething();

以上方這段程式碼來說,如果我這邊不執行 doSomething(); 的話,上方兩個 function 的作用域也不會被創建喔!

這就呼應到一開始我們講的,function 要被 呼叫 | 調用 的時候才會創建作用域

那麼執行上述的這段程式碼的話,我們可以想像,作用域從

  1. 全域作用域
  2. 創建 doSomething 的作用域
  3. 創建變數 mom 並且賦值 '老媽'
  4. 列印出後方的結果,同時執行 sayHi(mom) 的 function
  5. 創建 sayHi 的作用域
  6. 帶入變數 name = '老媽'
  7. 回傳字串 'hi 老媽'
  8. 回到 doSomething 的作用域
  9. console.log出結果
  10. 回到全域作用域

這樣的過程,我們的作用域就進行了執行堆疊的概念

https://ithelp.ithome.com.tw/upload/images/20191002/20121770muR0yDXmrj.png

首先在第一步驟的時候,執行堆疊的狀況是

https://ithelp.ithome.com.tw/upload/images/20191002/20121770vifPvZG6Fx.png

https://ithelp.ithome.com.tw/upload/images/20191002/201217701ti4VJLZxI.png

再來第二步驟,執行 doSomething 的時候創建對應的作用域

https://ithelp.ithome.com.tw/upload/images/20191002/20121770g0SUrwmVIG.png

https://ithelp.ithome.com.tw/upload/images/20191002/20121770wHwaPDlFx1.png

https://ithelp.ithome.com.tw/upload/images/20191002/20121770u7nG3bL2h9.png

執行到 console.log 的時候,又執行了 sayHi 的 funciton, 創建了對應的作用域

https://ithelp.ithome.com.tw/upload/images/20191002/20121770mTvznQDLid.png

https://ithelp.ithome.com.tw/upload/images/20191002/20121770pAPY94MVQ2.png

https://ithelp.ithome.com.tw/upload/images/20191002/20121770zUeqqdDBLR.png

等到 sayHi 的內容處理完之後,就離開 sayHi 的作用域,回到了 doSomething 的作用域

https://ithelp.ithome.com.tw/upload/images/20191002/20121770zgCxURR0wb.png

https://ithelp.ithome.com.tw/upload/images/20191002/20121770loI0CTUxCB.png

印出 console.log 的結果之後,同樣的也離開 doSomething 的作用域,回到全域的作用域

https://ithelp.ithome.com.tw/upload/images/20191002/20121770WMVxCZmafg.png

https://ithelp.ithome.com.tw/upload/images/20191002/20121770ERa5Jir0JK.png

這樣的狀況就叫做,執行堆疊

透過另外一段程式碼,透過同一段 function 創建不同的 執行環境

function openTheDoor (num) {

    return '開第 ' + num + ' 扇門';

}

function openDoors () {

    openTheDoor(1);

    for (var i = 2; i < 5; i++) {

        openTheDoor(i);

    }

}

openDoors();

透過上方的函式,作用域從全域 => openDoors => openTheDoor => openDoors => openTheDoor ....值到迴圈跑完以後,才從openTheDoor => 全域。

也可以自己用chrome的瀏覽器source的工具式式看喔~

本篇 作用環境執行堆疊 的講解就到這~汪汪


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言